/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.mindbox.mueblesalpes.negocio.entity;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

/**
 * Clase que representa la compra de un mueble.
 * @author jsanchez
 */
@Entity
@Table(name="compra")
public class Compra implements Serializable, Cloneable{

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_COMPRA")
    @SequenceGenerator(name = "SEQ_COMPRA", allocationSize = 1, sequenceName = "compra_seq")
    private Long idCompra;

    @OneToOne
    private Mueble mueble;
    private int cantidad;
    private double precio;

    @ManyToOne
    @JoinColumn(name="idVenta")
    private Venta venta;

    /**
     * Contruye una compra vacía
     */
    public Compra() {
        this(null, 0, 0.0);
    }

    /**
     *
     * @param mueble
     * @param cantidad
     * @param precio
     */
    public Compra(Mueble mueble, int cantidad, double precio) {
        this.mueble = mueble;
        this.cantidad = cantidad;
        this.precio = precio;
    }

    /**
     * Obtiene la cantidad
     * @return int
     */
    public int getCantidad() {
        return cantidad;
    }

    /**
     * Coloca la cantidad
     * @param cantidad
     */
    public void setCantidad(int cantidad) {
        this.cantidad = cantidad;
    }

    /**
     * Obtiene el mueble
     * @return Mueble
     */
    public Mueble getMueble() {
        return mueble;
    }

    /**
     * Coloca el mueble
     * @param mueble
     */
    public void setMueble(Mueble mueble) {
        this.mueble = mueble;
    }

    /**
     * Obtiene el precio
     * @return double
     */
    public double getPrecio() {
        return precio;
    }

    /**
     * Coloca el precio
     * @param precio
     */
    public void setPrecio(double precio) {
        this.precio = precio;
    }

    /**
     * Obtiene el Id
     * @return Long
     */
    public Long getIdCompra() {
        return idCompra;
    }

    /**
     * Coloca el Id de compra
     * @param idCompra
     */
    public void setIdCompra(Long idCompra) {
        this.idCompra = idCompra;
    }

    @Override
    public boolean equals(Object obj) {
        if(obj != null & obj instanceof Compra &&
                this.getIdCompra() != null && 
                ((Compra)obj).getIdCompra() != null)
            return this.getIdCompra().equals(((Compra)obj).getIdCompra());
        return false;
    }
    @Override
    public Object clone() throws CloneNotSupportedException {
        Compra c = new Compra();
        c.setCantidad(this.getCantidad());
        c.setIdCompra(this.getIdCompra());
        c.setMueble((Mueble)this.getMueble().clone());
        c.setPrecio(this.getPrecio());
        return c;
    }

    @Override
    public int hashCode() {
        if(this.getIdCompra() == null)
            return 0;
        return this.getIdCompra().hashCode();
    }

    /**
     * Obtiene la venta asociada a la compra
     * @return Venta
     */
    public Venta getVenta() {
        return venta;
    }

    /**
     * Coloca la venta
     * @param venta
     */
    public void setVenta(Venta venta) {
        this.venta = venta;
    }
}
